﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebSite.DAL;
using WebSite.Domain;
using System.IO;
using DiagnosisMaker;

namespace WebSite
{

    public enum DiagnosisControlError
    {
        NoErrors,
        CasoPacienteNotFound,
        DiaginosisDatainsufficient,
        RespostaDiscretaNotFound,

    }

    public class DiagnosisDataControl
    {

        const int MINCASOS = 50;
        private DiagnosisControlError currentError;

        public DiagnosisDataControl()
        {
            currentError = DiagnosisControlError.NoErrors;
        }



        public string GenerateDiagnosis(int idCasoPaciente)
        {
            CasoPaciente casoPaciente = CasoPacienteDAO.BuscarCasoPaciente(idCasoPaciente);
            string dianostico = string.Empty;

            if (casoPaciente == null)
            {                
                currentError = DiagnosisControlError.CasoPacienteNotFound;                
            }
            else
            {
                List<Doenca> doencas = DoencaDAO.BuscarDoencasPorProntuario(casoPaciente.idProntuario);  //Procurar DOencas relacionado ao Prontuario  if (casoPaciente.idDoencaSugerida == null)
                List<ItemProntuario> itens = new List<ItemProntuario>();
                ItemProntuarioDAO.BuscarItensDeProntuario(casoPaciente.idProntuario, itens);
                string idMedico = HttpContext.Current.Session["idMedico"].ToString();

                if(doencas != null)
                {
                    //verifica por uma quantidade minima de Classes de Resposta (MIN 2);
                   if (doencas.Count >= 2 && itens.Count >= 2)
                   {
                       string filestemPath = "c:\\SistemaProntuario";
                       string filestem = string.Format("M{0}_C{1}",idMedico,casoPaciente.idICasoPaciente);

                       string fullFileName = string.Format("{0}\\{1}",filestemPath,filestem);
                       FilestemNamesGenerator(fullFileName,idMedico, casoPaciente, doencas, itens);
                       FilestemDataGenerator(fullFileName, idMedico, casoPaciente);


                       DiagnosisMaker.DiagnosisMaker dm = new DiagnosisMaker.DiagnosisMaker();    

                       //Conversão do caso especifico para o formato C4.5
                       List<RespostaProntuario> respostasCaso = RespostaProntuarioDAO.BuscarRespostasProntuario(casoPaciente.idICasoPaciente);
                       List<string> filestemNames = new List<string>();
                       foreach(ItemProntuario item in itens)
                       {
                           filestemNames.Add(item.idItemProntuario.ToString());
                       }
                       
                       List<string> filestemData = new List<string>();
                       foreach(RespostaProntuario rp in respostasCaso)
                       {
                           if (rp.RespostaContinua != string.Empty)
                               filestemData.Add(rp.RespostaContinua.Trim().Replace(" ", "_").Replace(",","."));
                           else
                           {
                               string respDiscreta = rp.idRepostaDiscreta.ToString();
                               filestemData.Add(respDiscreta);
                           }
                       }

                       dianostico = dm.returnDiagnosis(filestemPath, filestem, filestemNames, filestemData);                       
                       
                   }
                   else
                   {
                       currentError = DiagnosisControlError.DiaginosisDatainsufficient;
                   }                    
                }                
            }
            return dianostico;
        }



        protected void FilestemNamesGenerator(string filename,string idMedico, CasoPaciente casoPaciente, List<Doenca> doencas, List<ItemProntuario> itens)
        {
            filename += ".names";
            TextWriter filestemNames;

            if (!File.Exists(filename))
            {
                filestemNames = new StreamWriter(filename);

                string textToFile = string.Empty;
                //Gerar as Classes
                foreach (Doenca doenca in doencas)
                {
                    textToFile += string.Format("{0}, ", doenca.idDoenca.ToString());
                }

                textToFile = textToFile.Substring(0, textToFile.LastIndexOf(","));


                filestemNames.Write("{0}.\n\n", textToFile);

                textToFile = string.Empty;

                //Gera os Atributos
                foreach (ItemProntuario item in itens)
                {
                    filestemNames.Write("{0}: ", item.idItemProntuario.ToString());
                    if (item.tipoContinuo == 1)
                    {
                        filestemNames.Write(" continuos.\n");
                    }
                    else
                    {
                        List<RespostaDiscreta> respostasDiscretas = RespostaDiscretaDAO.BuscarRespostaDiscreta(item.idItemProntuario);

                        textToFile = string.Empty;

                        foreach (RespostaDiscreta rd in respostasDiscretas)
                        {

                            textToFile += string.Format("{0}, ", rd.idRespostaDiscreta.ToString());
                        }

                        textToFile = textToFile.Substring(0, textToFile.LastIndexOf(","));

                        filestemNames.Write("{0}.\n",textToFile);
                    }
                }
                filestemNames.Flush();

                filestemNames.Close();
            }
        }

        protected void FilestemDataGenerator(string filename, string idMedico, CasoPaciente casoPaciente)
        {
            filename += ".data";
            TextWriter filestemData;

            int casosSemDiagnostico = 0;
            int casosDiagnosticados = 0;

            List<CasoPaciente> casosDoProntuario = CasoPacienteDAO.BuscarCasosPaciente(casoPaciente.idProntuario);

            if (!File.Exists(filename))
            {

                filestemData = new StreamWriter(filename);

                foreach (CasoPaciente caso in casosDoProntuario)
                {

                    if (caso.idDoencaSugerida != 0)
                    {
                        casosDiagnosticados++;

                        List<RespostaProntuario> respostasProntuario = RespostaProntuarioDAO.BuscarRespostasProntuario(caso.idICasoPaciente);

                        if (respostasProntuario != null)
                        {
                            
                            foreach (RespostaProntuario resposta in respostasProntuario)
                            {
                                if (resposta.RespostaContinua != string.Empty)
                                {
                                    filestemData.Write("{0}, ", (resposta.RespostaContinua.Trim().Replace(" ", "_").Replace(",", ".")));
                                }
                                else
                                {                                                                      
                                    filestemData.Write("{0}, ", resposta.idRepostaDiscreta.ToString());  
                                }

                            }
                        }
                       
                        //Doenca doenca = DoencaDAO.BuscarDoenca(caso.idDoencaSugerida);
                        filestemData.Write("{0}\n", caso.idDoencaSugerida.ToString());                        
                    }
                    else
                    {
                        casosSemDiagnostico++;
                    }
                    
                }
                filestemData.Flush();
                filestemData.Close();
            }
        }

       

    }
}